#pragma once
#ifndef CHATSERVER_H
#define CHATSERVER_H

#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>

using namespace muduo;
using namespace muduo::net;

/**
 * muduo一般的使用模板：
 * 1.组合TcpServer对象
 * 2.创建EventLoop事件循环对象指针
 * 3.明确TcpServer构造函数需要什么参数（有三个必要的），输出ChatServer的构造函数
 * 4.在当前服务器类的构造函数中，注册处理连接的回调函数和处理读写事件回调函数
 * 5.设置合适的服务端线程数量，muduo库会自己分配I/O线程和工作线程
 */

//聊天服务器类 
class ChatServer{
public:
    //带参数构造函数，初始化聊天服务器对象
    ChatServer(EventLoop* loop,
                const InetAddress& listenAddr,
                const string& name);

    //服务器启动服务
    void start();

private:
    //服务端对象
    TcpServer _server;

    //循环事件指针
    EventLoop* _loop;

private:
    //客户端连接或断开事件回调函数
    void onClientConnection(const TcpConnectionPtr&);

    /**
     * 客户端读写事件回调函数
     * @param conn: 客户端连接对象
     * @param buffer: 缓冲区
     * @param time: 接收到数据时的时间
     */
    void onMessage(const TcpConnectionPtr& conn,    //连接
                    Buffer* buffer,                 //缓冲区
                    Timestamp time);                //接收到数据时候的时间

};

#endif